package com.ux.manager
{
	import com.ux.base.BLoader;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.events.Event;
	import flash.utils.Dictionary;

	public class ImageManager
	{
		
		public static var imgLoaderList : Dictionary = new Dictionary(true);
		
		private static var proxyImgList : Dictionary = new Dictionary( true );
		private static var proxyLoadHandlerList : Dictionary = new Dictionary( true );
		private static var proxyBitmapDataList : Dictionary = new Dictionary( true );
		
		private static var bitmapDataList : Dictionary = new Dictionary( true );
		/**
		 * @param url - 로드하고자 하는 url
		 * @param onLoadHandler - 로드 완료시 핸들러
		 * @param onUpdateHandler - 최초 로딩바를 위한 로드 업데이트 핸들러
		 * @return 
		 */		
		public static function getImage( url:String, onLoadHandler:Function = null, onUpdateHandler:Function = null ):Bitmap
		{
			
			if( bitmapDataList[ url ] != null )
			{
				// 로딩이 되어있으면 비트맵 데이터 복제 후 비트맵 반환
				if( onLoadHandler != null ) onLoadHandler();
				return new Bitmap( bitmapDataList[ url ] );
			}
			else
			{
				// 일단 비트맵 생성 후 반환,
				var bit : Bitmap = new Bitmap();
				
				// 해당 url 에 대한 프록시 비트맵 리스트 생성
				if( proxyImgList[ url ] == null ) proxyImgList[ url ] = [];
				( proxyImgList[ url ] as Array ).push( bit );
				
				// 해당 url 에 대한 프록시 완료 핸들러 생성
				if( proxyLoadHandlerList[ url ] == null ) proxyLoadHandlerList[ url ] = [];
				( proxyLoadHandlerList[ url ] as Array ).push( onLoadHandler );
				
				// 한번도 로드되지 않은 url 이면 로더 생성 ( 업데이트 핸들러가 있을경우 실행된다. )
				if( imgLoaderList[ url ] == null ) imgLoaderList[ url ] = new BLoader( url, null, onLoadComplete, onUpdateHandler );
				
				return bit;
			}
		}
		
		
		/**
		 * @param url 로드하고자 하는 url.
		 * @param onLoadHandler = param : BitmapData 로 받아야 함.
		 * @return BitmapData or null
		 */		
		public static function getBitmapData( url:String , onLoadHandler : Function = null ):BitmapData
		{
			if( bitmapDataList[ url ] != null )
			{
				if( onLoadHandler != null ) onLoadHandler( bitmapDataList[ url ] );
				return bitmapDataList[ url ];
			}
			else
			{
				if( proxyBitmapDataList[ url ] == null ) proxyBitmapDataList[ url ] = [];
				( proxyBitmapDataList[ url ] as Array ).push( onLoadHandler );
				return null;
			}
		}
		
		// 하나의 비트맵 로드 완료시.
		private static function onLoadComplete( e:Event ):void
		{
			var url : String = ( e.target as LoaderInfo ).url;
			var ldr : Loader = ( e.target as LoaderInfo ).loader;
			
			// 하나의 url 에 걸린 모든 프록시 비트맵의 비트맵 데이터 일괄 변경.
			var len:int = ( proxyImgList[ url ] as Array ).length;
			for( var i:int = 0; i<len; i++ )
			{
				var bt : BitmapData = new BitmapData(( ldr.content as Bitmap ).width, ( ldr.content as Bitmap ).height);
				bt.draw( ( ldr.content as Bitmap ) );
				
				var bit : Bitmap = ( proxyImgList[ url ] as Array ).shift() as Bitmap;
				bit.bitmapData = bt;
				
				var loadHandler : Function = ( proxyLoadHandlerList[ url ] as Array ).shift() as Function;
				if( loadHandler != null ) loadHandler();
			}
			
			if( proxyBitmapDataList[ url ] != null && ( proxyBitmapDataList[ url ] as Array ).length != 0 )
			{
				len = ( proxyBitmapDataList[ url ] as Array ).length;
				for( i = 0; i<len; i++ )
				{
					var getBitmapHandler : Function = ( proxyBitmapDataList[ url ] as Array ).shift() as Function;
					if( getBitmapHandler == null ) continue;
					
					getBitmapHandler( ( ldr.content as Bitmap ).bitmapData );
				}
			}
			
			// 다 로드된 비트맵 데이터는 따로 Dictionary 에 담아둔다.
			bitmapDataList[ url ] = ( ldr.content as Bitmap ).bitmapData;
		}
		
		
		/**
		 *  ImageManager
		 */		
		public function ImageManager()
		{
		}
	}
}